package 题目集.数学;

import java.util.Scanner;

public class 约瑟夫环问题 {

    /**
     * 思路1：暴力模拟
     */
    public static int fun(int n, int m) {
        int[] queue = new int[n + 1];
        int h = 0, t = 0;
        for (int i = 1; i <= n; i++) {
            queue[t++] = i;
        }
        for (int i = 1; i < n; i++) {
            for (int j = 1; j < m; j++) {
                queue[t] = queue[h];
                t = (t + 1) % queue.length;
                h = (h + 1) % queue.length;
            }
            h = (h + 1) % queue.length;
        }
        return queue[h];
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
//        System.out.println(fun(n, m));
//        System.out.println(f(n, m) + 1);  //因为f(n,m)返回的是最终结果对应的下标，下标从0开始，最终结果从1开始，所以额外+1
        System.out.println(f2(n, m) + 1);  //因为f(n,m)返回的是最终结果对应的下标，下标从0开始，最终结果从1开始，所以额外+1
    }

    /**
     * 设f(n,m)为，总人数为n时，每局出局m个，最后一个出局人的下标（从0开始）（注意：并不是原问题中某个人的编号）
     * 设已经知道了f(n,m)=res。我们是否能知道f(n-1,m)
     * f(n-1,m)，其实是f(n,m)在进行了第一轮后，res移动到了哪里。
     * 例如f(11,3)=6,当进行第一轮移除后，会把第3个移除，把前两个移到屁股上。对于6来说，相当于前移了 3格。所以f(10,3)=6-3
     * 所以f(n-1,m)=f(n,m)-m。（当然为了防止越界，应当加上取模操作）
     * f(n,m)也就是f(n-1,m)的求逆，即f(n,m)=f(n-1,m)+m
     */
    public static int f(int n, int m) {
        if (n == 1) return 0; //当总人数只有一个时，最后移除的下标为0.
        return (f(n - 1, m) + m) % n;
    }

    /**
     * 在f1的基础上递归转递推
     */
    public static int f2(int n, int m) {
        int last = 0;   //f1=0
        for (int i = 2; i <= n; i++) {  //没有f(0)，这里不能从0或1开始
            last = (last + m) % i;      //i是子问题的n，
        }
        return last;
    }
}
